/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package NajaTaskClient.Conexao;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.alias.CannotResolveClassException;
import com.thoughtworks.xstream.converters.ConversionException;
import com.thoughtworks.xstream.io.StreamException;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author web
 */
public class Configuracoes {

    private static Configuracoes instancia;
    DBConfig config;
    String arquivoConfig = "DBconfig.xml";
    File arquivo;
    XStream xstream;

    /**
     *
     */
    public Configuracoes() {
        //criando um objeto DBConfig
        this.config = new DBConfig();
        // Criando um objeto XStream
        this.xstream = new XStream();
        this.carregaConfig();

    }

    /**
     * retorna a instancia de dbqueries
     * @return DbQueries
     */
    public static synchronized Configuracoes get() {
        if (instancia == null) {
            instancia = new Configuracoes();
        }
        return instancia;
    }
    /*
     * Testa o arquivo de configuração,retorna true se OK e false se Erro
     */

    /**
     * Obtem o objeto que guarda as configurações
     * @return DBConfig
     */
    public DBConfig obterConfig() {
        return this.config;
    }

    /**
     * Obtem o objeto que guarda as configurações
     * @return DBConfig
     */
    public boolean restaurarPadrao() {
        this.config.restauraPadrao();
        this.salvaConfig();
        return true;
    }

    /**
     *
     * @throws FileNotFoundException
     * @throws IOException
     */
    private void carregaConfig() {
        // Lendo o arquivo
        this.arquivo = new File(this.arquivoConfig);
        //Verifica se o arquivo existe
        if (this.arquivo.exists() && this.arquivo.length() > 0) { // se arquivo existir
            FileInputStream fis = null;

            int ln;
            String configXML = "";
            try {
                fis = new FileInputStream(this.arquivo);
            } catch (FileNotFoundException ex) {
                Logger.getLogger(Configuracoes.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                while ((ln = fis.read()) != -1) {
                    configXML += (char) ln;
                }
                fis.close();
            } catch (IOException ex) {
                Logger.getLogger(Configuracoes.class.getName()).log(Level.SEVERE, null, ex);
            }



            try {
                /*testa o arquivo de configurção */
                this.config = (DBConfig) this.xstream.fromXML(configXML);
            } catch (CannotResolveClassException ex) {
                this.recuperaErro();
            } catch (StreamException ex) {
                this.recuperaErro();
            } catch (ConversionException ex) {
                this.recuperaErro();
            }


        } else {
            this.salvaConfig();
        }




    }

    private void recuperaErro() {
        /* se houve erro no arquivo , recria-o*/
        JOptionPane.showMessageDialog(null,
                "Erro inesperado no arquivo de configuração \"DBconfig.xml\" , as configurações"
                + " padrões serão carregadas",
                "Erro",
                JOptionPane.ERROR_MESSAGE);
        this.restaurarPadrao();
        this.carregaConfig();
    }
    /*public String obter(String conf){
    // this.xstream.
    }*/

    /**
     *
     * @throws FileNotFoundException
     * @throws IOException
     */
    public boolean salvaConfig() {
        // Passando os dados de Objetos Java para XML
        String configXML = this.xstream.toXML(this.config);

        // Gravando no arquivo
        this.arquivo = new File(this.arquivoConfig);
        FileOutputStream fos;
        try {
            fos = new FileOutputStream(this.arquivo);
            try {
                fos.write(configXML.getBytes());
                fos.close();
                return true;
            } catch (IOException ex) {
                Logger.getLogger(Configuracoes.class.getName()).log(Level.SEVERE, null, ex);
                return false;
            }

        } catch (FileNotFoundException ex) {
            Logger.getLogger(Configuracoes.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }



    }

    /**
     *
     * @param args
     * @throws FileNotFoundException
     * @throws IOException
     */
    public static void main(String[] args) throws FileNotFoundException, IOException {
        Configuracoes teste = new Configuracoes();
        //teste.salvaConfig();


    }
}
